package com.developteam.xnmall.websocket;

import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;

// 订单超时——轮询的效率低，非常浪费资源（因为必须不停连接，或者 HTTP 连接始终打开）。http 通信是单向的，请求 + 响应，没有请求也就没有响应，通信只能由客户端发起
// WebSocket 就是这样发明的。服务器可以主动向客户端推送信息，客户端也可以主动向服务器发送信息，是真正的双向平等对话，属于服务器推送技术的一种。

/*
1.了解技术
2.了解项目开发业务
3.寻求多种解决方案，什么时候用哪一种*/

@Component  //交给Spring管理
@ServerEndpoint("/webSocket/{oid}")  //申明节点，可以接受别人请求
public class WebSocketServer {

    private static ConcurrentHashMap<String,Session> sessionMap = new ConcurrentHashMap<>();

    /**前端发送请求建立websocket连接，就会执行@OnOpen方法**/
    @OnOpen
    public void open(@PathParam("oid") String orderId, Session session){
        System.out.println("------------建立连接："+orderId);
        sessionMap.put(orderId,session);
    }

    /**前端关闭页面或者主动关闭websocket连接，都会执行close**/
    @OnClose
    public void close(@PathParam("oid") String orderId){
        sessionMap.remove(orderId);
    }

//    封装向前端发送消息的方法
    public static void sendMsg(String orderId,String msg){
        try {
            Session session = sessionMap.get(orderId);  //拿到连接对象
            session.getBasicRemote().sendText(msg);  //拿到session对应的远程前端界面并发送信息
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}
